{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "mathco machinehack.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "RTAQ5LMS0qAY",
        "outputId": "2093a8d7-0ad1-4d18-eda4-346654a4b3e9"
      },
      "source": [
        "!wget \"https://machinehack-be.s3.amazonaws.com/data_hack_mathcothon_car_price_prediction_challenge/Participant_Data_TheMathCompany_.DSHH.zip\""
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "--2021-07-18 18:12:02--  https://machinehack-be.s3.amazonaws.com/data_hack_mathcothon_car_price_prediction_challenge/Participant_Data_TheMathCompany_.DSHH.zip\n",
            "Resolving machinehack-be.s3.amazonaws.com (machinehack-be.s3.amazonaws.com)... 52.219.156.15\n",
            "Connecting to machinehack-be.s3.amazonaws.com (machinehack-be.s3.amazonaws.com)|52.219.156.15|:443... connected.\n",
            "HTTP request sent, awaiting response... 200 OK\n",
            "Length: 585753 (572K) [application/octet-stream]\n",
            "Saving to: ‘Participant_Data_TheMathCompany_.DSHH.zip’\n",
            "\n",
            "Participant_Data_Th 100%[===================>] 572.02K  1.09MB/s    in 0.5s    \n",
            "\n",
            "2021-07-18 18:12:03 (1.09 MB/s) - ‘Participant_Data_TheMathCompany_.DSHH.zip’ saved [585753/585753]\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "P0b2kThl01Bs",
        "outputId": "052a6616-8ec4-4a21-9692-07969cbdc48e"
      },
      "source": [
        "!unzip \"Participant_Data_TheMathCompany_.DSHH.zip\""
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Archive:  Participant_Data_TheMathCompany_.DSHH.zip\n",
            "  inflating: train.csv               \n",
            "  inflating: __MACOSX/._train.csv    \n",
            "  inflating: test.csv                \n",
            "  inflating: __MACOSX/._test.csv     \n",
            "  inflating: submission.csv          \n",
            "  inflating: __MACOSX/._submission.csv  \n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ic4CMPuN1KpU",
        "outputId": "d6848595-ca5f-4915-baf9-dcd14751ad6a"
      },
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import warnings\n",
        "warnings.simplefilter(action='ignore', category=FutureWarning)\n",
        "!pip install rfpimp\n",
        "!pip install catboost\n",
        "from sklearn.metrics import mean_absolute_error,accuracy_score\n",
        "import lightgbm as lgb\n",
        "from sklearn.linear_model import LinearRegression\n",
        "from sklearn.model_selection import StratifiedKFold,KFold,GridSearchCV,GroupKFold,train_test_split,StratifiedShuffleSplit\n",
        "from rfpimp import *\n",
        "from tqdm import tqdm\n",
        "from catboost import *\n",
        "from sklearn.neighbors import KNeighborsClassifier\n",
        "from xgboost import XGBClassifier\n",
        "from sklearn.preprocessing import LabelEncoder"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Collecting rfpimp\n",
            "  Downloading rfpimp-1.3.7.tar.gz (10 kB)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from rfpimp) (1.19.5)\n",
            "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from rfpimp) (1.1.5)\n",
            "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.7/dist-packages (from rfpimp) (0.22.2.post1)\n",
            "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from rfpimp) (3.2.2)\n",
            "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->rfpimp) (2.4.7)\n",
            "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->rfpimp) (2.8.1)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->rfpimp) (0.10.0)\n",
            "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->rfpimp) (1.3.1)\n",
            "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from cycler>=0.10->matplotlib->rfpimp) (1.15.0)\n",
            "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas->rfpimp) (2018.9)\n",
            "Requirement already satisfied: scipy>=0.17.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->rfpimp) (1.4.1)\n",
            "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->rfpimp) (1.0.1)\n",
            "Building wheels for collected packages: rfpimp\n",
            "  Building wheel for rfpimp (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "  Created wheel for rfpimp: filename=rfpimp-1.3.7-py3-none-any.whl size=10668 sha256=89d00c1370d8012d74d03b16b12cc935e91206c1a696ffad01c1e87a7b40bcbb\n",
            "  Stored in directory: /root/.cache/pip/wheels/ad/48/d9/21fc62fbeff405425b0d5dd8b0354576cdb62ac97f6b11d1ef\n",
            "Successfully built rfpimp\n",
            "Installing collected packages: rfpimp\n",
            "Successfully installed rfpimp-1.3.7\n",
            "Collecting catboost\n",
            "  Downloading catboost-0.26-cp37-none-manylinux1_x86_64.whl (69.2 MB)\n",
            "\u001b[K     |████████████████████████████████| 69.2 MB 4.9 kB/s \n",
            "\u001b[?25hRequirement already satisfied: numpy>=1.16.0 in /usr/local/lib/python3.7/dist-packages (from catboost) (1.19.5)\n",
            "Requirement already satisfied: pandas>=0.24.0 in /usr/local/lib/python3.7/dist-packages (from catboost) (1.1.5)\n",
            "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (from catboost) (1.4.1)\n",
            "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from catboost) (3.2.2)\n",
            "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from catboost) (1.15.0)\n",
            "Requirement already satisfied: plotly in /usr/local/lib/python3.7/dist-packages (from catboost) (4.4.1)\n",
            "Requirement already satisfied: graphviz in /usr/local/lib/python3.7/dist-packages (from catboost) (0.10.1)\n",
            "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.24.0->catboost) (2.8.1)\n",
            "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.24.0->catboost) (2018.9)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->catboost) (0.10.0)\n",
            "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->catboost) (2.4.7)\n",
            "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->catboost) (1.3.1)\n",
            "Requirement already satisfied: retrying>=1.3.3 in /usr/local/lib/python3.7/dist-packages (from plotly->catboost) (1.3.3)\n",
            "Installing collected packages: catboost\n",
            "Successfully installed catboost-0.26\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qxSUuFuXWoJz"
      },
      "source": [
        "train = pd.read_csv('train.csv')\n",
        "test = pd.read_csv('test.csv')"
      ],
      "execution_count": 47,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 416
        },
        "id": "DSYhL6n4W1VQ",
        "outputId": "91db621c-bdca-46f2-dcab-7438d5ae324e"
      },
      "source": [
        "train.head(-2)"
      ],
      "execution_count": 48,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>ID</th>\n",
              "      <th>Price</th>\n",
              "      <th>Levy</th>\n",
              "      <th>Manufacturer</th>\n",
              "      <th>Model</th>\n",
              "      <th>Prod. year</th>\n",
              "      <th>Category</th>\n",
              "      <th>Leather interior</th>\n",
              "      <th>Fuel type</th>\n",
              "      <th>Engine volume</th>\n",
              "      <th>Mileage</th>\n",
              "      <th>Cylinders</th>\n",
              "      <th>Gear box type</th>\n",
              "      <th>Drive wheels</th>\n",
              "      <th>Doors</th>\n",
              "      <th>Wheel</th>\n",
              "      <th>Color</th>\n",
              "      <th>Airbags</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>45654403</td>\n",
              "      <td>13328</td>\n",
              "      <td>1399</td>\n",
              "      <td>LEXUS</td>\n",
              "      <td>RX 450</td>\n",
              "      <td>2010</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Hybrid</td>\n",
              "      <td>3.5</td>\n",
              "      <td>186005 km</td>\n",
              "      <td>6.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>4x4</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Silver</td>\n",
              "      <td>12</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>44731507</td>\n",
              "      <td>16621</td>\n",
              "      <td>1018</td>\n",
              "      <td>CHEVROLET</td>\n",
              "      <td>Equinox</td>\n",
              "      <td>2011</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>No</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>3</td>\n",
              "      <td>192000 km</td>\n",
              "      <td>6.0</td>\n",
              "      <td>Tiptronic</td>\n",
              "      <td>4x4</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Black</td>\n",
              "      <td>8</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>45774419</td>\n",
              "      <td>8467</td>\n",
              "      <td>-</td>\n",
              "      <td>HONDA</td>\n",
              "      <td>FIT</td>\n",
              "      <td>2006</td>\n",
              "      <td>Hatchback</td>\n",
              "      <td>No</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>1.3</td>\n",
              "      <td>200000 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Variator</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Right-hand drive</td>\n",
              "      <td>Black</td>\n",
              "      <td>2</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>45769185</td>\n",
              "      <td>3607</td>\n",
              "      <td>862</td>\n",
              "      <td>FORD</td>\n",
              "      <td>Escape</td>\n",
              "      <td>2011</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Hybrid</td>\n",
              "      <td>2.5</td>\n",
              "      <td>168966 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>4x4</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>White</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>45809263</td>\n",
              "      <td>11726</td>\n",
              "      <td>446</td>\n",
              "      <td>HONDA</td>\n",
              "      <td>FIT</td>\n",
              "      <td>2014</td>\n",
              "      <td>Hatchback</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>1.3</td>\n",
              "      <td>91901 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Silver</td>\n",
              "      <td>4</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19230</th>\n",
              "      <td>45760891</td>\n",
              "      <td>470</td>\n",
              "      <td>645</td>\n",
              "      <td>TOYOTA</td>\n",
              "      <td>Prius</td>\n",
              "      <td>2011</td>\n",
              "      <td>Hatchback</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Hybrid</td>\n",
              "      <td>1.8</td>\n",
              "      <td>307325 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Silver</td>\n",
              "      <td>12</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19231</th>\n",
              "      <td>45772306</td>\n",
              "      <td>5802</td>\n",
              "      <td>1055</td>\n",
              "      <td>MERCEDES-BENZ</td>\n",
              "      <td>E 350</td>\n",
              "      <td>2013</td>\n",
              "      <td>Sedan</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Diesel</td>\n",
              "      <td>3.5</td>\n",
              "      <td>107800 km</td>\n",
              "      <td>6.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>Rear</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Grey</td>\n",
              "      <td>12</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19232</th>\n",
              "      <td>45798355</td>\n",
              "      <td>8467</td>\n",
              "      <td>-</td>\n",
              "      <td>MERCEDES-BENZ</td>\n",
              "      <td>CLK 200</td>\n",
              "      <td>1999</td>\n",
              "      <td>Coupe</td>\n",
              "      <td>Yes</td>\n",
              "      <td>CNG</td>\n",
              "      <td>2.0 Turbo</td>\n",
              "      <td>300000 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Manual</td>\n",
              "      <td>Rear</td>\n",
              "      <td>02-Mar</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Silver</td>\n",
              "      <td>5</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19233</th>\n",
              "      <td>45778856</td>\n",
              "      <td>15681</td>\n",
              "      <td>831</td>\n",
              "      <td>HYUNDAI</td>\n",
              "      <td>Sonata</td>\n",
              "      <td>2011</td>\n",
              "      <td>Sedan</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>2.4</td>\n",
              "      <td>161600 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Tiptronic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Red</td>\n",
              "      <td>8</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19234</th>\n",
              "      <td>45804997</td>\n",
              "      <td>26108</td>\n",
              "      <td>836</td>\n",
              "      <td>HYUNDAI</td>\n",
              "      <td>Tucson</td>\n",
              "      <td>2010</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Diesel</td>\n",
              "      <td>2</td>\n",
              "      <td>116365 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Grey</td>\n",
              "      <td>4</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>19235 rows × 18 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "             ID  Price  Levy  ...             Wheel   Color  Airbags\n",
              "0      45654403  13328  1399  ...        Left wheel  Silver       12\n",
              "1      44731507  16621  1018  ...        Left wheel   Black        8\n",
              "2      45774419   8467     -  ...  Right-hand drive   Black        2\n",
              "3      45769185   3607   862  ...        Left wheel   White        0\n",
              "4      45809263  11726   446  ...        Left wheel  Silver        4\n",
              "...         ...    ...   ...  ...               ...     ...      ...\n",
              "19230  45760891    470   645  ...        Left wheel  Silver       12\n",
              "19231  45772306   5802  1055  ...        Left wheel    Grey       12\n",
              "19232  45798355   8467     -  ...        Left wheel  Silver        5\n",
              "19233  45778856  15681   831  ...        Left wheel     Red        8\n",
              "19234  45804997  26108   836  ...        Left wheel    Grey        4\n",
              "\n",
              "[19235 rows x 18 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 48
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 416
        },
        "id": "s0NoxCOq-kBB",
        "outputId": "0f03c027-88fe-4590-f9c5-4dee95bd6789"
      },
      "source": [
        "test.head(-2)"
      ],
      "execution_count": 49,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>ID</th>\n",
              "      <th>Levy</th>\n",
              "      <th>Manufacturer</th>\n",
              "      <th>Model</th>\n",
              "      <th>Prod. year</th>\n",
              "      <th>Category</th>\n",
              "      <th>Leather interior</th>\n",
              "      <th>Fuel type</th>\n",
              "      <th>Engine volume</th>\n",
              "      <th>Mileage</th>\n",
              "      <th>Cylinders</th>\n",
              "      <th>Gear box type</th>\n",
              "      <th>Drive wheels</th>\n",
              "      <th>Doors</th>\n",
              "      <th>Wheel</th>\n",
              "      <th>Color</th>\n",
              "      <th>Airbags</th>\n",
              "      <th>Price</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>44020629</td>\n",
              "      <td>-</td>\n",
              "      <td>VOLKSWAGEN</td>\n",
              "      <td>Golf</td>\n",
              "      <td>2012</td>\n",
              "      <td>Hatchback</td>\n",
              "      <td>No</td>\n",
              "      <td>Diesel</td>\n",
              "      <td>2.0 Turbo</td>\n",
              "      <td>0 km</td>\n",
              "      <td>4</td>\n",
              "      <td>Manual</td>\n",
              "      <td>Front</td>\n",
              "      <td>02-Mar</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Grey</td>\n",
              "      <td>10</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>45784798</td>\n",
              "      <td>-</td>\n",
              "      <td>HYUNDAI</td>\n",
              "      <td>Sonata</td>\n",
              "      <td>2012</td>\n",
              "      <td>Sedan</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>2.4</td>\n",
              "      <td>26000 km</td>\n",
              "      <td>4</td>\n",
              "      <td>Tiptronic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Grey</td>\n",
              "      <td>10</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>45800257</td>\n",
              "      <td>-</td>\n",
              "      <td>NISSAN</td>\n",
              "      <td>Tiida</td>\n",
              "      <td>2005</td>\n",
              "      <td>Sedan</td>\n",
              "      <td>No</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>1.5</td>\n",
              "      <td>168000 km</td>\n",
              "      <td>4</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Right-hand drive</td>\n",
              "      <td>Sky blue</td>\n",
              "      <td>8</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>45797981</td>\n",
              "      <td>975</td>\n",
              "      <td>VOLVO</td>\n",
              "      <td>XC90</td>\n",
              "      <td>2012</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>3.2</td>\n",
              "      <td>143000 km</td>\n",
              "      <td>6</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>4x4</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Blue</td>\n",
              "      <td>12</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>45814303</td>\n",
              "      <td>-</td>\n",
              "      <td>OPEL</td>\n",
              "      <td>Astra</td>\n",
              "      <td>1993</td>\n",
              "      <td>Hatchback</td>\n",
              "      <td>No</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>1.6</td>\n",
              "      <td>200000 km</td>\n",
              "      <td>4</td>\n",
              "      <td>Manual</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Black</td>\n",
              "      <td>0</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8238</th>\n",
              "      <td>44012311</td>\n",
              "      <td>-</td>\n",
              "      <td>VOLKSWAGEN</td>\n",
              "      <td>CC</td>\n",
              "      <td>2009</td>\n",
              "      <td>Coupe</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>2</td>\n",
              "      <td>1000 km</td>\n",
              "      <td>6</td>\n",
              "      <td>Tiptronic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>White</td>\n",
              "      <td>8</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8239</th>\n",
              "      <td>45787008</td>\n",
              "      <td>645</td>\n",
              "      <td>TOYOTA</td>\n",
              "      <td>Prius</td>\n",
              "      <td>2011</td>\n",
              "      <td>Sedan</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>1.8</td>\n",
              "      <td>283000 km</td>\n",
              "      <td>4</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>White</td>\n",
              "      <td>4</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8240</th>\n",
              "      <td>44824410</td>\n",
              "      <td>1357</td>\n",
              "      <td>FIAT</td>\n",
              "      <td>Stilo</td>\n",
              "      <td>2004</td>\n",
              "      <td>Universal</td>\n",
              "      <td>No</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>1.6</td>\n",
              "      <td>164000 km</td>\n",
              "      <td>4</td>\n",
              "      <td>Manual</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Blue</td>\n",
              "      <td>6</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8241</th>\n",
              "      <td>45682346</td>\n",
              "      <td>-</td>\n",
              "      <td>BMW</td>\n",
              "      <td>528 F10</td>\n",
              "      <td>2012</td>\n",
              "      <td>Sedan</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>2.8 Turbo</td>\n",
              "      <td>156000 km</td>\n",
              "      <td>4</td>\n",
              "      <td>Tiptronic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Black</td>\n",
              "      <td>6</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8242</th>\n",
              "      <td>45649860</td>\n",
              "      <td>1646</td>\n",
              "      <td>LEXUS</td>\n",
              "      <td>GX 460</td>\n",
              "      <td>2015</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>4.6</td>\n",
              "      <td>102907 km</td>\n",
              "      <td>8</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>4x4</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Black</td>\n",
              "      <td>0</td>\n",
              "      <td>NaN</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>8243 rows × 18 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "            ID  Levy Manufacturer  ...     Color  Airbags Price\n",
              "0     44020629     -   VOLKSWAGEN  ...      Grey       10   NaN\n",
              "1     45784798     -      HYUNDAI  ...      Grey       10   NaN\n",
              "2     45800257     -       NISSAN  ...  Sky blue        8   NaN\n",
              "3     45797981   975        VOLVO  ...      Blue       12   NaN\n",
              "4     45814303     -         OPEL  ...     Black        0   NaN\n",
              "...        ...   ...          ...  ...       ...      ...   ...\n",
              "8238  44012311     -   VOLKSWAGEN  ...     White        8   NaN\n",
              "8239  45787008   645       TOYOTA  ...     White        4   NaN\n",
              "8240  44824410  1357         FIAT  ...      Blue        6   NaN\n",
              "8241  45682346     -          BMW  ...     Black        6   NaN\n",
              "8242  45649860  1646        LEXUS  ...     Black        0   NaN\n",
              "\n",
              "[8243 rows x 18 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 49
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "S5FOrIs73Tnz",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "837ab18f-9bc9-4637-ba85-970230348008"
      },
      "source": [
        "train['Price'].nlargest(10)"
      ],
      "execution_count": 50,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "16983    26307500\n",
              "8541       872946\n",
              "1225       627220\n",
              "5008       308906\n",
              "9367       297930\n",
              "14839      297930\n",
              "7749       288521\n",
              "10759      260296\n",
              "5840       254024\n",
              "15283      250574\n",
              "Name: Price, dtype: int64"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 50
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "B6BenCCOW3Ic"
      },
      "source": [
        "x=[]\n",
        "for i in train['Price']:\n",
        "  if i>300000:\n",
        "    x.append(290000)\n",
        "  else:\n",
        "    x.append(i)\n",
        "train['Price']=x"
      ],
      "execution_count": 51,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "u1zZK31iauVu"
      },
      "source": [
        "df=pd.concat([train,test])"
      ],
      "execution_count": 52,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1EwAJoKKW-vY",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 202
        },
        "outputId": "72b6cfa9-8934-41fb-9a64-dd8f57a7561b"
      },
      "source": [
        "df.head(5)"
      ],
      "execution_count": 53,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>ID</th>\n",
              "      <th>Price</th>\n",
              "      <th>Levy</th>\n",
              "      <th>Manufacturer</th>\n",
              "      <th>Model</th>\n",
              "      <th>Prod. year</th>\n",
              "      <th>Category</th>\n",
              "      <th>Leather interior</th>\n",
              "      <th>Fuel type</th>\n",
              "      <th>Engine volume</th>\n",
              "      <th>Mileage</th>\n",
              "      <th>Cylinders</th>\n",
              "      <th>Gear box type</th>\n",
              "      <th>Drive wheels</th>\n",
              "      <th>Doors</th>\n",
              "      <th>Wheel</th>\n",
              "      <th>Color</th>\n",
              "      <th>Airbags</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>45654403</td>\n",
              "      <td>13328.0</td>\n",
              "      <td>1399</td>\n",
              "      <td>LEXUS</td>\n",
              "      <td>RX 450</td>\n",
              "      <td>2010</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Hybrid</td>\n",
              "      <td>3.5</td>\n",
              "      <td>186005 km</td>\n",
              "      <td>6.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>4x4</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Silver</td>\n",
              "      <td>12</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>44731507</td>\n",
              "      <td>16621.0</td>\n",
              "      <td>1018</td>\n",
              "      <td>CHEVROLET</td>\n",
              "      <td>Equinox</td>\n",
              "      <td>2011</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>No</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>3</td>\n",
              "      <td>192000 km</td>\n",
              "      <td>6.0</td>\n",
              "      <td>Tiptronic</td>\n",
              "      <td>4x4</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Black</td>\n",
              "      <td>8</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>45774419</td>\n",
              "      <td>8467.0</td>\n",
              "      <td>-</td>\n",
              "      <td>HONDA</td>\n",
              "      <td>FIT</td>\n",
              "      <td>2006</td>\n",
              "      <td>Hatchback</td>\n",
              "      <td>No</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>1.3</td>\n",
              "      <td>200000 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Variator</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Right-hand drive</td>\n",
              "      <td>Black</td>\n",
              "      <td>2</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>45769185</td>\n",
              "      <td>3607.0</td>\n",
              "      <td>862</td>\n",
              "      <td>FORD</td>\n",
              "      <td>Escape</td>\n",
              "      <td>2011</td>\n",
              "      <td>Jeep</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Hybrid</td>\n",
              "      <td>2.5</td>\n",
              "      <td>168966 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>4x4</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>White</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>45809263</td>\n",
              "      <td>11726.0</td>\n",
              "      <td>446</td>\n",
              "      <td>HONDA</td>\n",
              "      <td>FIT</td>\n",
              "      <td>2014</td>\n",
              "      <td>Hatchback</td>\n",
              "      <td>Yes</td>\n",
              "      <td>Petrol</td>\n",
              "      <td>1.3</td>\n",
              "      <td>91901 km</td>\n",
              "      <td>4.0</td>\n",
              "      <td>Automatic</td>\n",
              "      <td>Front</td>\n",
              "      <td>04-May</td>\n",
              "      <td>Left wheel</td>\n",
              "      <td>Silver</td>\n",
              "      <td>4</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "         ID    Price  Levy  ...             Wheel   Color  Airbags\n",
              "0  45654403  13328.0  1399  ...        Left wheel  Silver       12\n",
              "1  44731507  16621.0  1018  ...        Left wheel   Black        8\n",
              "2  45774419   8467.0     -  ...  Right-hand drive   Black        2\n",
              "3  45769185   3607.0   862  ...        Left wheel   White        0\n",
              "4  45809263  11726.0   446  ...        Left wheel  Silver        4\n",
              "\n",
              "[5 rows x 18 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 53
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Q1Z2SVKr3KOj",
        "outputId": "9f02355a-48d2-4c34-8495-00fdfb82ca23"
      },
      "source": [
        "df.nunique(),df.isnull().sum()"
      ],
      "execution_count": 54,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(ID                  26886\n",
              " Price                2312\n",
              " Levy                  635\n",
              " Manufacturer           68\n",
              " Model                1981\n",
              " Prod. year             59\n",
              " Category               11\n",
              " Leather interior        2\n",
              " Fuel type               7\n",
              " Engine volume         112\n",
              " Mileage              9977\n",
              " Cylinders              16\n",
              " Gear box type           4\n",
              " Drive wheels            3\n",
              " Doors                   3\n",
              " Wheel                   2\n",
              " Color                  16\n",
              " Airbags                17\n",
              " dtype: int64, ID                     0\n",
              " Price               8245\n",
              " Levy                   0\n",
              " Manufacturer           0\n",
              " Model                  0\n",
              " Prod. year             0\n",
              " Category               0\n",
              " Leather interior       0\n",
              " Fuel type              0\n",
              " Engine volume          0\n",
              " Mileage                0\n",
              " Cylinders              0\n",
              " Gear box type          0\n",
              " Drive wheels           0\n",
              " Doors                  0\n",
              " Wheel                  0\n",
              " Color                  0\n",
              " Airbags                0\n",
              " dtype: int64)"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 54
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "vmNrGhfO1Mol"
      },
      "source": [
        "df['Mileage']=df['Mileage'].str.extract('(\\d+)').astype(int)"
      ],
      "execution_count": 55,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "s1uw4uxtnuD-"
      },
      "source": [
        "df['Levy']=df['Levy'].replace('-', np.nan)"
      ],
      "execution_count": 56,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JfMEOcfr1_T5"
      },
      "source": [
        "df['Levy']=df['Levy'].fillna(method='ffill')\n",
        "df['Levy']=df['Levy'].fillna(method='bfill')\n",
        "df['Levy']=df['Levy'].astype(int)"
      ],
      "execution_count": 57,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "avTAdkyh2vWN"
      },
      "source": [
        "a=[]\n",
        "b=[]\n",
        "for i in df['Engine volume']:\n",
        "  i=i.split(' ')\n",
        "  if len(i)==2:\n",
        "    a.append(i[0])\n",
        "    b.append(i[1])\n",
        "  else:\n",
        "    a.append(i[0])\n",
        "    b.append('non turbo')\n",
        "df['Engine volume']=a\n",
        "df['Engine volume Type']=b"
      ],
      "execution_count": 58,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "LUgdFrOK5GH8",
        "outputId": "999072d2-92f7-4a74-c3ac-941d0b9a27b6"
      },
      "source": [
        "x=list(df.select_dtypes(['object']).columns)\n",
        "x"
      ],
      "execution_count": 59,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['Manufacturer',\n",
              " 'Model',\n",
              " 'Category',\n",
              " 'Leather interior',\n",
              " 'Fuel type',\n",
              " 'Engine volume',\n",
              " 'Gear box type',\n",
              " 'Drive wheels',\n",
              " 'Doors',\n",
              " 'Wheel',\n",
              " 'Color',\n",
              " 'Engine volume Type']"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 59
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "oFTp0NQg522W"
      },
      "source": [
        "for i in x:\n",
        "  from sklearn.preprocessing import LabelEncoder\n",
        "  le = LabelEncoder()\n",
        "  df[i] = le.fit_transform(df[i])\n",
        "  df[i]=df[i]+1"
      ],
      "execution_count": 60,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ulDlllctGopp"
      },
      "source": [
        "temp = df.groupby(['Mileage']).agg({\n",
        "                                      'Mileage':['count','sum','mean','median','std'],\n",
        "                                      #'ID':['count','sum','mean','median','std'],\n",
        "                                      'Model':['count','mean','sum','median','std'],\n",
        "                                      'Prod. year':['count','mean','sum','median','std']\n",
        "                                      })\n",
        "temp.columns = ['_condd_'.join(x) for x in temp.columns]\n",
        "df = pd.merge(df,temp,on=['Mileage'],how='left')"
      ],
      "execution_count": 61,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wwxXqfAisdlh"
      },
      "source": [
        "#df = pd.get_dummies(df, columns=['Manufacturer'])\n",
        "xx=[]\n",
        "for i in df['Mileage']:\n",
        "  if i>1400000:\n",
        "    xx.append(1500000)\n",
        "  else:\n",
        "    xx.append(i)\n",
        "df['Mileage']=xx"
      ],
      "execution_count": 62,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "i-FNpAXvMf7y"
      },
      "source": [
        "del df['Doors']"
      ],
      "execution_count": 63,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jXmhXydI563A"
      },
      "source": [
        "train = df[df['Price'].isnull()==False]\n",
        "test = df[df['Price'].isnull()==True]\n",
        "del test['Price']\n",
        "#xxx=train['Price']\n",
        "#del train['Price']"
      ],
      "execution_count": 64,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "ZzJWoE1h8ChN"
      },
      "source": [
        "#Statical Features Extracting from train and test rows after droping Inovicedate or Exctracting features\n",
        "#Train\n",
        "#train['Std'] = train.std(axis=1).round(2)\n",
        "#train['quantile1'] = train.quantile(q=0.01,axis=1).round(2)\n",
        "#train['quantile3'] = train.quantile(q=0.25,axis=1).round(2)\n",
        "#train['quantile5'] = train.quantile(q=0.75,axis=1).round(2)                                              \n",
        "#train['Mean'] = train.mean(axis=1).round(2)\n",
        "#Test\n",
        "#test['Std'] = test.std(axis=1).round(2)\n",
        "#test['quantile1'] = test.quantile(q=0.01,axis=1).round(2)\n",
        "#test['quantile3'] = test.quantile(q=0.25,axis=1).round(2)\n",
        "#test['quantile5'] = test.quantile(q=0.75,axis=1).round(2)                                              \n",
        "#test['Mean'] = test.mean(axis=1).round(2)"
      ],
      "execution_count": 65,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "g9UNOolm8Ipj"
      },
      "source": [
        "#train['Price']=xxx"
      ],
      "execution_count": 66,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bB6LaNpM6IO2"
      },
      "source": [
        "train_df=train.copy()\n",
        "test_df=test.copy()"
      ],
      "execution_count": 67,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "t0RGh4tE6b1-"
      },
      "source": [
        "train_df['Price'] = np.log1p(train_df['Price'])"
      ],
      "execution_count": 68,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rQq0wukZ6Kw-"
      },
      "source": [
        "X = train_df.drop(labels=['Price'], axis=1)\n",
        "y = train_df['Price'].values\n",
        "\n",
        "from sklearn.model_selection import train_test_split\n",
        "X_train, X_cv, y_train, y_cv = train_test_split(X, y, test_size=0.10, random_state=42)"
      ],
      "execution_count": 69,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4PAM5FogP7oW",
        "outputId": "ba68d4c1-f7b6-4abd-ca86-9c88e8d35466"
      },
      "source": [
        "X_train.shape, y_train.shape, X_cv.shape, y_cv.shape"
      ],
      "execution_count": 70,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "((17313, 32), (17313,), (1924, 32), (1924,))"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 70
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yi8GCTfRP-CM"
      },
      "source": [
        "from sklearn.metrics import mean_squared_log_error\n",
        "from math import sqrt"
      ],
      "execution_count": 71,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FkLM2_IhQAD5",
        "outputId": "d5672676-ad10-462a-a68e-b7c6e9f2fb3e"
      },
      "source": [
        "import lightgbm as lgb\n",
        "train_data = lgb.Dataset(X_train, label=y_train)\n",
        "test_data = lgb.Dataset(X_cv, label=y_cv)\n",
        "\n",
        "param = {'objective': 'regression',\n",
        "         'boosting': 'gbdt',  \n",
        "         'metric': 'l2_root',\n",
        "         'learning_rate': 0.1, \n",
        "         'num_iterations': 3000,\n",
        "         'num_leaves': 79,\n",
        "         #'max_depth': -1,\n",
        "         'min_data_in_leaf': 11,\n",
        "         'bagging_fraction': 0.90,\n",
        "         'bagging_freq': 1,\n",
        "         'bagging_seed': 3,\n",
        "         'feature_fraction': 0.90,\n",
        "         'feature_fraction_seed': 2,\n",
        "         'early_stopping_round': 200,\n",
        "         'max_bin': 500,\n",
        "         'lambda': 2.8849054495567423, \n",
        "        'alpha': 4.001054193185317787, \n",
        "        'colsample_bytree': 0.5, \n",
        "        'subsample': 0.9, \n",
        "        'max_depth': 13, \n",
        "        'random_state': 42,\n",
        "        'min_child_weight': 5\n",
        "         }\n",
        "\n",
        "lgbm = lgb.train(params=param, verbose_eval=100, train_set=train_data, valid_sets=[test_data])\n",
        "\n",
        "y_pred_lgbm = lgbm.predict(X_cv)\n",
        "print('MSLE:', (mean_squared_log_error(np.expm1(y_cv), np.expm1(y_pred_lgbm))))"
      ],
      "execution_count": 72,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Training until validation scores don't improve for 200 rounds.\n",
            "[100]\tvalid_0's rmse: 0.788677\n",
            "[200]\tvalid_0's rmse: 0.763914\n",
            "[300]\tvalid_0's rmse: 0.756957\n",
            "[400]\tvalid_0's rmse: 0.75395\n",
            "[500]\tvalid_0's rmse: 0.755188\n",
            "[600]\tvalid_0's rmse: 0.755732\n",
            "Early stopping, best iteration is:\n",
            "[405]\tvalid_0's rmse: 0.753535\n",
            "MSLE: 0.5678156165382487\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 728
        },
        "id": "8ZilL1me6eAO",
        "outputId": "a0d97346-6fcd-4d72-ef11-018218afb4ef"
      },
      "source": [
        "import seaborn as sns\n",
        "feature_imp = pd.DataFrame(sorted(zip(lgbm.feature_importance(), X.columns), reverse=True)[:50], \n",
        "                           columns=['Value','Feature'])\n",
        "plt.figure(figsize=(12, 10))\n",
        "sns.barplot(x=\"Value\", y=\"Feature\", data=feature_imp.sort_values(by=\"Value\", ascending=False))\n",
        "plt.title('LightGBM Features')\n",
        "plt.tight_layout()\n",
        "plt.show()"
      ],
      "execution_count": 73,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 864x720 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QUbCfwqoQ-Ou"
      },
      "source": [
        "Xtest = test_df"
      ],
      "execution_count": 74,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "S_Qs1jp-RHG0",
        "outputId": "56efa676-597a-401c-baef-251e6c01d3a1"
      },
      "source": [
        "from sklearn.model_selection import KFold\n",
        "from lightgbm import LGBMRegressor\n",
        "\n",
        "errlgb = []\n",
        "y_pred_totlgb = []\n",
        "\n",
        "fold = KFold(n_splits=10, shuffle=True, random_state=42)\n",
        "\n",
        "for train_index, test_index in fold.split(X):\n",
        "    X_train, X_test = X.loc[train_index], X.loc[test_index]\n",
        "    y_train, y_test = y[train_index], y[test_index]\n",
        "\n",
        "    lgbm = LGBMRegressor(n_estimators=10000,**param,verbose= -1)\n",
        "    lgbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=0, early_stopping_rounds=200)\n",
        "\n",
        "    y_pred_lgbm = lgbm.predict(X_test)\n",
        "    print(\"RMSLE LGBM: \", sqrt(mean_squared_log_error(np.exp(y_test), np.exp(y_pred_lgbm))))\n",
        "\n",
        "    errlgb.append(sqrt(mean_squared_log_error(np.exp(y_test), np.exp(y_pred_lgbm))))\n",
        "    p = lgbm.predict(Xtest)\n",
        "    y_pred_totlgb.append(p)"
      ],
      "execution_count": 75,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.7610620866188231\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.8721762178840969\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.8271358458196282\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.8706722660289311\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.9147619404142843\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.8245159895906176\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.8222634164110748\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.8840190101379818\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.8565634737729116\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:118: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n",
            "/usr/local/lib/python3.7/dist-packages/lightgbm/engine.py:123: UserWarning: Found `early_stopping_round` in params. Will use it instead of argument\n",
            "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "RMSLE LGBM:  0.8640888174488549\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "2LeP737mXWOn",
        "outputId": "61bffd36-923a-4c9c-865e-6ce9bba41db2"
      },
      "source": [
        "np.mean(errlgb,0)"
      ],
      "execution_count": 76,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "0.8497259064127205"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 76
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "luN-4QiHXeW1",
        "outputId": "b62ba4e7-e2f3-4274-f99a-cee008be58ae"
      },
      "source": [
        "lgbm_final = np.expm1(np.mean(y_pred_totlgb,0))\n",
        "lgbm_final"
      ],
      "execution_count": 94,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "array([15494.21521  , 11193.8699   ,  7173.718425 , ...,   281.177037 ,\n",
              "       36617.31448  ,   533.2532193])"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 94
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "o1TJkeTuXfAs",
        "outputId": "4136fc7a-2e1d-4692-ffdf-9ae69649a63c"
      },
      "source": [
        "submission = pd.DataFrame({\n",
        "        \"Price\": lgbm_final #*0.97 #0.95,1.02,1.05\n",
        "    })\n",
        "submission.to_csv('./realdem.csv', index=False)\n",
        "print(submission)"
      ],
      "execution_count": 97,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "             Price\n",
            "0     15494.215210\n",
            "1     11193.869900\n",
            "2      7173.718425\n",
            "3     17170.851340\n",
            "4      1364.402810\n",
            "...            ...\n",
            "8240   4225.053782\n",
            "8241  24020.936650\n",
            "8242    281.177037\n",
            "8243  36617.314480\n",
            "8244    533.253219\n",
            "\n",
            "[8245 rows x 1 columns]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3haaScbx06dw"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    }
  ]
}